package com.atguigui.leetcode;

/**
 * 622.设计循环队列
 * Project: leetcode
 * Package: com.atguigui.leetcode
 * Version: 1.0
 * <p>
 * Created by  wangjiaxin  on 2022/8/2 20:49
 */
public class P622DesignCircularQueue {
    public static void main(String[] args) {
        MyCircularQueue solution = new P622DesignCircularQueue().new MyCircularQueue(6);
        // TO TEST
    }

    class MyCircularQueue {
        //总容量
        private int sum;
        private ListNode first = null;
        private ListNode last = null;
        //队列中的个数
        private int nums = 0;

        //构造器，设置队列长度为 k
        public MyCircularQueue(int k) {
            sum = k;
        }

        //向循环队列插入一个元素。如果成功插入则返回真。
        public boolean enQueue(int value) {
            if (isFull()) {
                return false;
            }
            if (first == null) {
                ListNode listNode = new ListNode(value);
                first = last = listNode;
            } else {
                //往最后一位插入数据
                ListNode listNode = new ListNode(value);
                last.next = listNode;
                last = listNode;
            }

            nums++;

            return true;
        }

        //从循环队列中删除一个元素。如果成功删除则返回真。
        public boolean deQueue() {
            //删除头节点
            if (isEmpty()) {
                return false;
            } else {
                ListNode next = first.next;
                first = next;
            }
            nums--;

            return true;
        }

        //从队首获取元素。如果队列为空，返回 -1 。
        public int Front() {
            if (isEmpty()) {
                return -1;
            }
            return first.value;
        }

        //获取队尾元素。如果队列为空，返回 -1 。
        public int Rear() {
            if (isEmpty()) {
                return -1;
            }
            return last.value;
        }

        //检查循环队列是否为空。
        public boolean isEmpty() {
            return nums == 0;
        }

        //检查循环队列是否已满。
        public boolean isFull() {
            return nums == sum;
        }

        class ListNode {
            private ListNode next = null;
            private int value;


            public ListNode(int val) {
                value = val;
            }
        }
    }


}
